<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //【变量声明let】
        // ES6新语法,用来声明变量。
        // 【作用】
        // 声明一个块级作用域的本地变量// 可以设置初始值
        // 【语法】// 声明变量
        let x
        // 声明并设置初始值
        let y = 10

        console.log(y);
        //重新赋值
        y = "世界"
        // 打印结果
        console.log(y);//世界
        
        // 【注意点1-不允许重复声明】
        // let不允许在相同作用域内,重复声明同一个变量。

        // function func() {
        //     let a = 10;
        //     var a = 10;
        // }
        // function func (){
        //     let a = 10;
        //     let a = 1;
        // }

        //	【注意点2-有块级作用域】	
        // 它的用法类似于var,但是所声明的变量,只能在let命令所在的代码块内有效。
        // 在下面代码块之中,分别用let和var声明了两个变量。
        {
        let a = 10; 
        var b = 1;
        console.log(a);//10 
        console.log(b);//1
    }
        // console.log(a); //undefined
        // console.log(b); //1
        // 结果let声明的变量报错,var声明的变量返回了正确的值。
        // 这表面,let声明的变量只在它所在的代码块有效。
        // console.log(a); //a is not defined
        //console.log(b); //1

        // 【注意点3-不会变量提升】
        // var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为underfined。
        // 这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。
        // 为了纠正这种现象,let命令改变了语法行为,它声明的变量一定要在声明后使用,否则报错。
        // var的情况
        console.log(foo);
        var foo =2; //undefined// let的情况
        console.log(bar);////Cannot access "bar’ before initialization(无法在初始化之前访问变 
        let bar = 2;
        
        // 【总结】
        // 1.不能重复声明
        // 2.有块级作用域
        // 3.不会变量提升
    </script>
</body>
</html>